package global

import (
	"gin_tem/utils"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
)

// InitializeLog ========================================初始化日志====================================
func InitializeLog() {
	// 创建根目录
	//判断文件是否存在
	if ok := utils.HasPath(Config.Log.RootDir); !ok {
		//不存在就创建
		_ = os.Mkdir(Config.Log.RootDir, 0755)
	}
	//设置日志等级
	setLevel()
	if Config.Log.ShowLine {
		options = append(options, zap.AddCaller())
	}
	// 初始化 zap
	ZapLog = zap.New(getLogCore(), options...)
	//刷新缓冲
	defer ZapLog.Sync()

}

// ========================================================设置log level等级========================================================
func setLevel() {
	switch Config.Log.Level {
	case "debug":
		level = zap.DebugLevel
		options = append(options, zap.AddStacktrace(level))
	case "info":
		level = zap.InfoLevel
	case "warn":
		level = zap.WarnLevel
	case "error":
		level = zap.ErrorLevel
		options = append(options, zap.AddStacktrace(level))
	case "dpanic":
		level = zap.DPanicLevel
	case "panic":
		level = zap.PanicLevel
	case "fatal":
		level = zap.FatalLevel
	default:
		level = zap.InfoLevel
	}

}

// ========================================================获取日志写入器========================================================
func getLogWriter() zapcore.WriteSyncer {
	file := &lumberjack.Logger{
		//日志输出文件路径
		Filename: Config.Log.RootDir + "/" + Config.Log.Filename,
		//日志文件最大 size, 单位是 MB
		MaxSize: Config.Log.MaxSize,
		//最大过期日志保留的个数
		MaxBackups: Config.Log.MaxBackups,
		//保留过期文件的最大时间间隔,单位是天
		MaxAge: Config.Log.MaxAge,
		//是否需要压缩滚动日志, 使用的 gzip 压缩
		Compress: Config.Log.Compress,
	}
	//写入到log文件
	syncFile := zapcore.AddSync(file)
	return zapcore.NewMultiWriteSyncer(syncFile)
	//打印到控制台
	//syncConsole := zapcore.AddSync(os.Stderr)
	//return zapcore.NewMultiWriteSyncer(syncFile, syncConsole)

}
func getLogCore() zapcore.Core {
	var encoder zapcore.Encoder

	// ========================================================调整编码器默认配置 NewProductionEncoderConfig这里创建了zapcore.EncoderConfig 创建了一个编码器
	encoderConfig := zap.NewProductionEncoderConfig()
	////=============================================等同上面======================================================================
	//--------------------------------------------------------------------------------------修改时间编码器
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	//--------------------------------------------------------------------------------------在日志文件中使用大写字母记录日志级别
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
	// ===============================设置编码器 获取全局中管理log的字段format进行判断 设置==============================================
	if Config.Log.Format == "json" {
		encoder = zapcore.NewJSONEncoder(encoderConfig)
	} else {
		encoder = zapcore.NewConsoleEncoder(encoderConfig)
	}
	// ========================================================zapcore.NewCore()需要三个参数========================================================
	//encode 以什么形式写入 json获取其他
	//getLogWriter() 写入的位置
	//level 等级
	return zapcore.NewCore(encoder, getLogWriter(), level)
}
